package cn.dengta.webapp.user.entity;

import javax.validation.constraints.NotNull;

import cn.dengta.common.model.ValueProxy;
import cn.dengta.common.model.ValueProxyImpl;
import cn.dengta.webapp.base.entity.TimeBasedEntity;
import lombok.Getter;
import lombok.Setter;
import me.codeplayer.util.StringUtil;

import static cn.dengta.webapp.user.entity.OauthUser.ThirdOauthType;

/**
 * 终端信息表
 *
 * @author lgy
 * @since 2022-02-24
 */
@Getter
@Setter
public class ClientInfo extends TimeBasedEntity {

	/** 客户端ID */
	private String clientId;
	/** App-Id请求头原始字符串 */
	private String appId;
	/** User-Agent请求头原始字符串 */
	private String userAgent;
	/** 设备信息 */
	private String device;
	/** 操作系统信息 */
	private String system;
	/** 浏览器信息 */
	private String browser;

	public ClientInfo init(String clientId, String appId, String userAgent) {
		this.clientId = clientId;
		this.appId = StringUtil.toString(appId);
		this.userAgent = StringUtil.toString(userAgent);
		this.device = "";
		this.system = "";
		this.browser = "";
		return this;
	}

	@Getter
	public enum LoginWay implements ValueProxyImpl<LoginWay, Integer> {
		/** 通过密码 */
		BY_PASSWORD(0, "密码"),
		/** 通过记住密码（自动登录） */
		BY_REMEMBER_PASSWORD(1, "记住密码"),
		/** 通过短信验证码 */
		BY_CAPTCHA(2, "验证码"),
		/** 通过苹果授权登录 */
		BY_APPLE_AUTH(3, "Apple", ThirdOauthType.APPLE.alias),
		/** 通过谷歌授权登录 */
		BY_GOOGLE_AUTH(4, "Google", ThirdOauthType.GOOGLE.alias),
		/** 通过抖音授权登录 */
		BY_TIKTOK_AUTH(5, "TikTok", ThirdOauthType.TIK_TOK.alias),
		/** 通过 Facebook 授权登录 */
		BY_FACEBOOK_AUTH(6, "Facebook", ThirdOauthType.FACEBOOK.alias),
		/** 通过 移动一键 授权登录 */
		BY_FAST_MOBILE(7, "FastMobile", ThirdOauthType.FAST_MOBILE.alias),
		/** 通过邮箱验证码 */
		BY_MAIL_CAPTCHA(8, "邮箱验证码"),
		//
		;

		// 定义私有变量
		public final Integer value;
		public final String alias;
		final ValueProxy<LoginWay, Integer> proxy;

		// 构造函数，枚举类型只能为私有
		LoginWay(Integer value, String label, String alias) {
			this.value = value;
			this.alias = alias;
			this.proxy = new ValueProxy<>(this, value, label);
		}

		LoginWay(Integer value, String label) {
			this(value, label, null);
		}

		public static LoginWay[] getValues() {
			return ValueProxy.getCachedArray(LoginWay.class, LoginWay::values);
		}

		public static LoginWay of(@NotNull String alias) {
			LoginWay[] values = getValues();
			for (LoginWay loginWay : values) {
				if (alias.equals(loginWay.alias)) {
					return loginWay;
				}
			}
			return null;
		}

		public boolean hasAlias() {
			return StringUtil.notEmpty(alias);
		}

		public static LoginWay of(Integer value) {
			return BY_PASSWORD.getValueOf(value);
		}

		@Override
		public ValueProxy<LoginWay, Integer> getProxy() {
			return proxy;
		}

	}

}
